import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 设置中文字体 - 选择系统中可用的中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'KaiTi', 'SimSun', 'FangSong']  # 常用中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 生成模拟温度数据
days = 100
np.random.seed(42)  # 确保结果可重现
temps = 20 + np.random.randn(days) * 5  # 平均20°C，标准差5°C

# 计算指数加权平均
beta = 0.9
v = 0
ewma = []
for t in range(days):
    v = beta * v + (1 - beta) * temps[t]
    ewma.append(v)

# 带偏差修正的计算
v_corrected = 0
ewma_corrected = []
for t in range(days):
    v_corrected = beta * v_corrected + (1 - beta) * temps[t]
    ewma_corrected.append(v_corrected / (1 - beta**(t+1)))

# 可视化
plt.figure(figsize=(12, 6))
plt.plot(temps, 'o-', alpha=0.5, label='原始温度')
plt.plot(ewma, 'r-', linewidth=2, label=f'EWMA (β={beta})')
plt.plot(ewma_corrected, 'g--', linewidth=2, label=f'带偏差修正')
plt.title('指数加权移动平均温度平滑')
plt.xlabel('天数')
plt.ylabel('温度 (°C)')
plt.legend()
plt.grid(True)
plt.tight_layout()  # 自动调整布局
plt.savefig('ewma_plot.png', dpi=300)  # 保存图像避免字体问题
plt.show()

# 不同β值的影响
betas = [0.5, 0.8, 0.9, 0.95, 0.99]
plt.figure(figsize=(12, 8))

for beta_val in betas:
    v = 0
    ewma_temp = []
    for temp in temps:
        v = beta_val * v + (1 - beta_val) * temp
        ewma_temp.append(v)
    plt.plot(ewma_temp, label=f'β={beta_val}')

plt.plot(temps, 'ko', alpha=0.3, label='原始数据')
plt.title('不同β值的平滑效果')
plt.xlabel('时间步')
plt.ylabel('值')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig('beta_comparison.png', dpi=300)
plt.show()